03-060. 공백데이터 처리
공백 데이터 처리
텍스트 데이터에는 앞뒤 공백, 중간 공백, 탭 문자 등이 포함되어 있을 수 있다. 이런 공백은 데이터 분석과 비교 작업에 문제를 일으킨다. 공백은 눈에 잘 보이지 않기 때문에 알아채기 쉽지 않은 문제를 일으킨다.
공백 데이터의 문제점
- 데이터 중복:
"제품A"
와" 제품A "
는 같은 데이터로 보이지만 다르게 인식됨 - 그룹화 오류: 카테고리별 집계 시 같은 카테고리가 분리되어 계산됨
- 검색 실패: 정확한 값으로 검색해도 공백 때문에 찾지 못함
- 정렬 오류: 공백이 있는 데이터가 예상과 다른 위치에 정렬됨
공백 데이터 예시
원본 데이터 (공백 포함)
제품명 | 카테고리 | 가격 |
---|---|---|
" 노트북 " | "전자제품 " | 1200000 |
"스마트폰" | " 전자제품" | 800000 |
"키보드 " | "액세서리" | 50000 |
기본 공백 처리 방법
import pandas as pd
# 샘플 데이터 생성
df = pd.DataFrame([
[' 노트북 ', '전자제품 ', 1200000],
['스마트폰', ' 전자제품', 800000],
['키보드 ', '액세서리', 50000]
], columns=['제품명', '카테고리', '가격'])
print("원본 데이터:")
print(df)
print("\n각 값의 길이:")
for col in ['제품명', '카테고리']:
print(f"{col}: {df[col].str.len().tolist()}")
# 1. 문자열 앞뒤 공백 제거
df_cleaned = df.copy()
df_cleaned['제품명'] = df_cleaned['제품명'].str.strip()
df_cleaned['카테고리'] = df_cleaned['카테고리'].str.strip()
print("\n공백 제거 후:")
print(df_cleaned)
print("\n각 값의 길이:")
for col in ['제품명', '카테고리']:
print(f"{col}: {df_cleaned[col].str.len().tolist()}")
실행 결과:
원본 데이터:
제품명 카테고리 가격
0 노트북 전자제품 1200000
1 스마트폰 전자제품 800000
2 키보드 액세서리 50000
각 값의 길이:
제품명: [4, 3, 4]
카테고리: [4, 4, 3]
공백 제거 후:
제품명 카테고리 가격
0 노트북 전자제품 1200000
1 스마트폰 전자제품 800000
2 키보드 액세서리 50000
각 값의 길이:
제품명: [3, 3, 3]
카테고리: [3, 3, 3]
전체 데이터프레임 공백 처리
# 모든 문자열 컬럼의 공백을 한 번에 제거
def clean_whitespace(df):
df_clean = df.copy()
string_columns = df_clean.select_dtypes(include=['object']).columns
for col in string_columns:
if df_clean[col].dtype == 'object':
df_clean[col] = df_clean[col].str.strip()
return df_clean
df_cleaned = clean_whitespace(df)
print("전체 공백 제거 결과:")
print(df_cleaned)
실행 결과:
전체 공백 제거 결과:
제품명 카테고리 가격
0 노트북 전자제품 1200000
1 스마트폰 전자제품 800000
2 키보드 액세서리 50000
고급 공백 처리
|코드|
# 복잡한 공백 문제가 있는 데이터
df_complex = pd.DataFrame([
[' 노트북\t게이밍 ', '전자제품\n ', 1200000],
['스마트폰 프리미엄', ' 전자제품\r', 800000],
['키보드\t\t무선', '액세서리 ', 50000]
], columns=['제품명', '카테고리', '가격'])
print("복잡한 공백 데이터:")
print(repr(df_complex.iloc[0, 0])) # 첫 번째 제품명의 실제 내용 확인
# 1. 중간 공백 정리 (여러 공백을 하나로)
df_complex['제품명'] = df_complex['제품명'].str.replace(r'\s+', ' ', regex=True)
# 2. 탭 문자와 줄바꿈 문자 제거
df_complex['제품명'] = df_complex['제품명'].str.replace(r'[\t\n\r]', '', regex=True)
df_complex['카테고리'] = df_complex['카테고리'].str.replace(r'[\t\n\r]', '', regex=True)
# 3. 앞뒤 공백 제거
df_complex['제품명'] = df_complex['제품명'].str.strip()
df_complex['카테고리'] = df_complex['카테고리'].str.strip()
print("\n고급 공백 처리 후:")
print(df_complex)
|실행 결과|
복잡한 공백 데이터:
' 노트북\t게이밍 '
고급 공백 처리 후:
제품명 카테고리 가격
0 노트북 게이밍 전자제품 1200000
1 스마트폰 프리미엄 전자제품 800000
2 키보드 무선 액세서리 50000
공백 처리 함수 만들기
|코드|
def comprehensive_clean(df):
"""
데이터프레임의 모든 문자열 컬럼에서 공백을 종합적으로 처리
"""
df_clean = df.copy()
string_columns = df_clean.select_dtypes(include=['object']).columns
for col in string_columns:
if df_clean[col].dtype == 'object':
# 1. 탭, 줄바꿈 문자 제거
df_clean[col] = df_clean[col].str.replace(r'[\t\n\r]', '', regex=True)
# 2. 여러 공백을 하나로 통합
df_clean[col] = df_clean[col].str.replace(r'\s+', ' ', regex=True)
# 3. 앞뒤 공백 제거
df_clean[col] = df_clean[col].str.strip()
return df_clean
# 사용 예시
df_final = comprehensive_clean(df)
print("종합 공백 처리 결과:")
print(df_final)
|실행 결과|
종합 공백 처리 결과:
제품명 카테고리 가격
0 노트북 전자제품 1200000
1 스마트폰 전자제품 800000
2 키보드 액세서리 50000
공백 처리 전후 비교
# 공백 처리의 효과 확인
def compare_before_after(df_before, df_after):
print("=== 공백 처리 전후 비교 ===")
print("\n카테고리별 개수 (처리 전):")
print(df_before['카테고리'].value_counts())
print("\n카테고리별 개수 (처리 후):")
print(df_after['카테고리'].value_counts())
print("\n중복 제품명 확인 (처리 전):")
print(f"고유 제품명 개수: {df_before['제품명'].nunique()}")
print("\n중복 제품명 확인 (처리 후):")
print(f"고유 제품명 개수: {df_after['제품명'].nunique()}")
compare_before_after(df, df_final)
실행 결과:
=== 공백 처리 전후 비교 ===
카테고리별 개수 (처리 전):
전자제품 1
전자제품 1
액세서리 1
Name: 카테고리, dtype: int64
카테고리별 개수 (처리 후):
전자제품 2
액세서리 1
Name: 카테고리, dtype: int64
중복 제품명 확인 (처리 전):
고유 제품명 개수: 3
중복 제품명 확인 (처리 후):
고유 제품명 개수: 3
실무 팁
- 데이터 로드 시 공백 처리: CSV 파일을 읽을 때
skipinitialspace=True
옵션 사용 - 정규 표현식 활용: 복잡한 공백 패턴은 정규 표현식으로 처리
- 검증: 공백 처리 후 데이터 개수와 고유값 개수 확인
- 자동화: 데이터 전처리 파이프라인에 공백 처리 함수 포함
# CSV 파일 읽을 때 공백 처리
df = pd.read_csv('data.csv', skipinitialspace=True)
# 또는 읽은 후 처리
df = pd.read_csv('data.csv')
df = comprehensive_clean(df)
공백 데이터 처리는 데이터 품질 향상의 기본이며, 정확한 분석 결과를 얻기 위해 반드시 수행해야 하는 전처리 과정이다.